﻿using System.Collections.Generic;
using System.Linq;

namespace System
{
	public static partial class Utility
	{
		#region "Sabit Mesajlar"

        private static string VergiNoSadeceRakamOlmali = "Vergi numarası sadece rakamlardan oluşabilir !";
        private static string VergiNoEksikGirildi = "Vergi numarası 10 hane olmalıdır !";
        private static string VergiNoHataliNo = "Vergi numarası doğru formatta değil !";

		#endregion

        private static string mVnMesaj = "";
        public static string VnMesaj
		{
			get
			{
                return mVnMesaj;
			}
		}

        public static bool VergiNoDogrula(string sVergiNo)
		{
			int digitCount = sVergiNo.Length;
			if (sVergiNo.Length == 0)
			{
                mVnMesaj = VergiNoEksikGirildi;
				return false;
			}
			if (!sVergiNo.IsNumeric())
			{
                mVnMesaj = VergiNoSadeceRakamOlmali;
				return false;
			}

			if (digitCount != 10)
			{
                mVnMesaj = VergiNoEksikGirildi;
				return false;
			}
			long vergiNo = long.Parse(sVergiNo);
			int checkDigit = 0;
			var digits = new List<int>();
			for (int i = 0; i < digitCount; i++)
			{
				if (i == 0)
				{
					checkDigit = (int)(vergiNo % 10);
				}
				else
				{
					digits.Add((int)(vergiNo % 10));
				}
				vergiNo /= 10;
			}
			//eger 0 azalmssa
			for (int i = 0; i < digitCount - digits.Count; i++)
				digits.Add(0);
			for (int i = 1; i < 10; i++)
			{
				digits[i - 1] = (digits[i - 1] + i) % 10;
			}
			for (int i = 1; i < 10; i++)
			{
				digits[i - 1] = (digits[i - 1] * Power(2, i));
			}
			for (int i = 0; i < digits.Count; i++)
			{
				var digitTemp = digits[i];
				int digitSum = 0;
				while (digitTemp != 0)
				{
					digitSum += digitTemp % 10;
					digitTemp /= 10;
				}
				if (digitSum > 9)
				{
					digitSum = digitSum % 9;
					if (digitSum == 0)
						digitSum = 9;
				}
				digits[i] = digitSum;
			}
			int total = digits.Sum();
			int greaterNumber = 0;
			if (total % 10 == 0)
				greaterNumber = total;
			else
				greaterNumber = ((total / 10) + 1) * 10;
			if (greaterNumber - total == checkDigit)
				return true;

            mVnMesaj = VergiNoHataliNo;
			return false;
		}

        private static int Power(int a, int b)
		{
			int f = 1;
			for (int i = 1; i <= b; i++)
				f *= a;
			return f;
		}
	}
}
